#!/usr/bin/perl

#
#       Copyright (C) 2008-2012 Александр Девяткин, "Зелёная горка"
#
#       Разрешается повторное распространение и использование как в виде исходного
#       кода, так и в двоичной форме, с изменениями или без, при соблюдении следующих
#       условий:
#
#       * При повторном распространении исходного кода должно оставаться указанное
#         выше уведомление об авторском праве, этот список условий и последующий
#         отказ от гарантий.
#       * При повторном распространении двоичного кода должна сохраняться указанная
#         выше информация об авторском праве, этот список условий и последующий отказ
#         от гарантий в документации и/или в других материалах, поставляемых при
#         распространении.
#       * Ни название "Зелёная горка", ни имена ее сотрудников не могут быть
#         использованы в качестве поддержки или продвижения продуктов, основанных
#         на этом ПО без предварительного письменного разрешения.
#
#       ЭТА ПРОГРАММА ПРЕДОСТАВЛЕНА ВЛАДЕЛЬЦАМИ АВТОРСКИХ ПРАВ И/ИЛИ ДРУГИМИ СТОРОНАМИ
#	"КАК ОНА ЕСТЬ" БЕЗ КАКОГО-ЛИБО ВИДА ГАРАНТИЙ, ВЫРАЖЕННЫХ ЯВНО ИЛИ ПОДРАЗУМЕВАЕМЫХ,
#	ВКЛЮЧАЯ, НО НЕ ОГРАНИЧИВАЯСЬ ИМИ, ПОДРАЗУМЕВАЕМЫЕ ГАРАНТИИ КОММЕРЧЕСКОЙ ЦЕННОСТИ
#	И ПРИГОДНОСТИ ДЛЯ КОНКРЕТНОЙ ЦЕЛИ. НИ В КОЕМ СЛУЧАЕ, ЕСЛИ НЕ ТРЕБУЕТСЯ
#	СООТВЕТСТВУЮЩИМ ЗАКОНОМ, ИЛИ НЕ УСТАНОВЛЕНО В УСТНОЙ ФОРМЕ, НИ ОДИН ВЛАДЕЛЕЦ
#	АВТОРСКИХ ПРАВ И НИ ОДНО ДРУГОЕ ЛИЦО, КОТОРОЕ МОЖЕТ ИЗМЕНЯТЬ И/ИЛИ ПОВТОРНО
#	РАСПРОСТРАНЯТЬ ПРОГРАММУ, КАК БЫЛО СКАЗАНО ВЫШЕ, НЕ НЕСЁТ ОТВЕТСТВЕННОСТИ,
#	ВКЛЮЧАЯ ЛЮБЫЕ ОБЩИЕ, СЛУЧАЙНЫЕ, СПЕЦИАЛЬНЫЕ ИЛИ ПОСЛЕДОВАВШИЕ УБЫТКИ,
#	ВСЛЕДСТВИЕ ИСПОЛЬЗОВАНИЯ ИЛИ НЕВОЗМОЖНОСТИ ИСПОЛЬЗОВАНИЯ ПРОГРАММЫ (ВКЛЮЧАЯ,
#	НО НЕ ОГРАНИЧИВАЯСЬ ПОТЕРЕЙ ДАННЫХ, ИЛИ ДАННЫМИ, СТАВШИМИ НЕПРАВИЛЬНЫМИ, ИЛИ
#	ПОТЕРЯМИ ПРИНЕСЕННЫМИ ИЗ-ЗА ВАС ИЛИ ТРЕТЬИХ ЛИЦ, ИЛИ ОТКАЗОМ ПРОГРАММЫ РАБОТАТЬ
#	СОВМЕСТНО С ДРУГИМИ ПРОГРАММАМИ), ДАЖЕ ЕСЛИ ТАКОЙ ВЛАДЕЛЕЦ ИЛИ ДРУГОЕ ЛИЦО БЫЛИ
#	ИЗВЕЩЕНЫ О ВОЗМОЖНОСТИ ТАКИХ УБЫТКОВ.
#

#       Copyright (C) 2008-2012 Aleksandr Deviatkin, "Green Hill"
#
#       Redistribution and use in source and binary forms, with or without
#       modification, are permitted provided that the following conditions are
#       met:
#       
#       * Redistributions of source code must retain the above copyright
#         notice, this list of conditions and the following disclaimer.
#       * Redistributions in binary form must reproduce the above
#         copyright notice, this list of conditions and the following disclaimer
#         in the documentation and/or other materials provided with the
#         distribution.
#       * Neither the name of the Green Hill nor the names of its
#         contributors may be used to endorse or promote products derived from
#         this software without specific prior written permission.
#       
#       THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
#       "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
#       LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
#       A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
#       OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
#       SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
#       LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
#       DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
#       THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
#       (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
#       OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#


$|=1;
use DBI;
use strict;

#
# Проверка тарифного расписания
# 2011-12-21 alid
#

my (@args, %opts);
foreach(@ARGV){
	if(/^\-(\S)(\S*)/) { $opts{$1} = $2; } else {  push @args, $_; }
}
my ($database) = (@args);
die "Usage: $0 database"		unless($database);
my $quiet = exists $opts{q};	# показывать только ошибки
my $force = exists $opts{f};	# выбирать все группы, невзирая на отсутствие флага active
my $mgid = $opts{g} || 0;	# только для этой группы (id)
my $pgport = 5432;

# тарифное расписание
my $T1 = '07:00';
my $T2 = '23:00';


my $dbh = DBI->connect("dbi:Pg:dbname=$database;port=$pgport","","", { RaiseError => 1});
my $sth;

# mgroups
my $Glist;
if($mgid) {	#
	$sth = $dbh->prepare("select mgroup.id,mgroup.name as name ,mgroup.memo,mgroup.modtime,mgroup.active,mgroup.rank,iface.id as if_id,iface.dev from mgroup left outer join iface on iface.id=mgroup.if_id where mgroup.id=?");
	$sth->execute($mgid);
} else {		#
	$sth = $dbh->prepare("select mgroup.id,mgroup.name as name ,mgroup.memo,mgroup.modtime,mgroup.active,mgroup.rank,iface.id as if_id,iface.dev from mgroup left outer join iface on iface.id=mgroup.if_id ".($force? "":"where mgroup.active=1")." order by rank");
	$sth->execute;
}
while(my $r = $sth->fetchrow_hashref) {
	push @$Glist, $r;
}
$sth->finish;

$sth = $dbh->prepare("select counters.id,counters.name,counters.addr,counters.passwd,counters.ktrans,counter_type.type,status.id as status_id,status.state,status.pstate,counters.sn,counters.setdate,towers.name as tname,street.name as sname,counters.house from counters left outer join counter_type on model=counter_type.id left outer join status on counters.id=status.cid left outer join towers on towers.id=counters.tower_id left outer join street on street.id=counters.street where counters.mgroup=? and counters.active=1");
my $se = $dbh->prepare("select date,se1ai,se2ai from monitor where counter=? order by date desc limit 300");

foreach my $mg (@$Glist) {
	unless($quiet) {
		print "*****************************************************\n";
		print $mg->{name}." [".$mg->{id}."] Active: ".$mg->{active}." Iface: ".$mg->{dev}." [".$mg->{if_id}."] Dev: ".$mg->{dev}."\n";
		print $mg->{memo}."\n";
	}
	# counters
	$sth->execute($mg->{id});	
	while(my $r = $sth->fetchrow_hashref) {
		my ($t1,$t2) = getar($r->{id});
#		my $str = "id: $r->{id} addr: $r->{addr} type: $r->{type}  sn: $r->{sn}  setdate: $r->{setdate} ktrans: $r->{ktrans} state: $r->{state} pstate: $r->{pstate} tower: $r->{tname} street: $r->{sname} house: $r->{house}";
		my $str = "id: $r->{id} addr: $r->{addr} type: $r->{type} tower: $r->{tname} street: $r->{sname} house: $r->{house}";
		unless($t1 & $t2) {
			print STDERR "NO DATA".($quiet ? " $mg->{name}":"").": $str\n";
		}
#		elsif(($t1 eq $T1) && ($t2 eq $T2)) {
#			print "OK ($t1,$t2): $str\n"	unless $quiet;
#		}
		else {
#			print STDERR "ERROR ($t1,$t2)".($quiet ? " $mg->{name}":"").": $str\n";
			print "($t1,$t2)".($quiet ? " $mg->{name}":"").": $str\n";
		}

	}
	$sth->finish;
}

$dbh->disconnect;

sub getar {
	my ($id) = @_;
	$se->execute($id);
	my ($t1,$t2);
	my ($se1,$se2,$ct);
	while(my $r = $se->fetchrow_hashref) {
#print $r->{se1ai}." ".$r->{se2ai}."\n";

		unless($se1 && $se2) {	# самое начало
			($se1,$se2) = ($r->{se1ai},$r->{se2ai});
#print "START: [$se1] [$se2]\n";

			next;
		}
		unless($ct) {
			if($se1 == $r->{se1ai}) {
				$ct = 2;

#print "CT2 [$se1] [$se2]\n";
				next;
			}
			if($se2 == $r->{se2ai}) {
				$ct = 1;
#print "CT1 [$se1] [$se2]\n";
				next;
			}

		}
#print join(":",(localtime($r->{date}))[2,1])." $se1 ".$r->{se1ai}." $se2 ".$r->{se2ai}."\n";
#		if($se1 == $r->{se1ai} && $se2 != $r->{se2ai} && $ct == 1) {	# переход на тариф 2
		if($se2 != $r->{se2ai} && $ct == 1) {	# переход на тариф 2
			($se1,$se2) = ($r->{se1ai},$r->{se2ai});
			$t2 = join(":",(localtime($r->{date}))[2,1]);
			$ct = 2;

#print "T2: [$t1] [$t2]\n";
			next;
		}
#		if($se1 != $r->{se1ai} && $se2 == $r->{se2ai} && $ct == 2) {	# переход на тариф 1
		if($se1 != $r->{se1ai} && $ct == 2) {	# переход на тариф 1
			($se1,$se2) = ($r->{se1ai},$r->{se2ai});
			$t1 = join(":",(localtime($r->{date}))[2,1]);
			$ct = 1;
#print "T1: [$t1] [$t2]\n";
			next;
		}
		last if($t1 && $t2);
		($se1,$se2) = ($r->{se1ai},$r->{se2ai});

	}
	$se->finish;
#print "($t1,$t2)\n";

	return ($t1,$t2);
}

